/**
 * @addtogroup bsc_gnss_location_frame
 * bsc_gnss_location_frame
 * @{
 */
/**
 * @file         bsc_gnss_location_frame.h
 * @brief        
 * @note    
 * @author       Akee(ysk@hopechart.com，尤胜坤)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-11-20  <td>1.0                   <td>Akee            <td>创建初始版本
 * <tr><td>2022-10-28  <td>1.1                   <td>Akee            <td>名字从gnss_location_frame.h改为bsc_gnss_location_frame.h,所有类型加Bs前缀
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _BSC_GNSS_LOCATION_FRAME_H_
#define _BSC_GNSS_LOCATION_FRAME_H_

#include "ofc/ofc_types.h"
#include "bsc_gps_device.h"
#include "bsc_gnss_nmea_parser.h"
#include "bsc_gnss_module_interface.h"
#include "bsc_gnss_attr_id_define.h"

#ifdef __cplusplus
extern "C" {
#endif
typedef struct TBsGnssLocationFrameTag TBsGnssLocationFrame;

typedef void(*TGnssLocationOnNmeaTokenEvent)(void *user_param, TNmeaTokenizer *tokens, TNmeaAddrField *addr, TBsGnssNmeaParserMsgParam *msg_param);

/**
 * 定位框架
 */
struct TBsGnssLocationFrameTag
{
    TBsGnssNmeaParser nmea_parse_;
    UInt8 recv_buf_[600];  ///< 为适配通过AT获取nmea原始数据由210改为600 <2023.9.5>
    TBsGpsDevice gps_device_;
    TBsGpsDeviceCallback gps_callback_;

    TGnssLocationOnNmeaTokenEvent OnNmeaToken_;
    void *nmea_token_user_param_;
    UInt32 first_location_flag_;
    UInt32 gps_time_;
    UInt32 gps_time_tick_;
    IBsGnssModule *gnss_module_;
    IBsGnssServerFuncs *gnss_server_funcs_;
    
    UInt32 parse_valid_tick_;
};

/**
 * 构造函数
 * @param self: 对象指针
 * @return 
 */
void TBsGnssLocationFrameCreate(TBsGnssLocationFrame *self, IBsGnssModule *gnss_module, IBsGnssServerFuncs *gnss_server_funcs);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void TBsGnssLocationFrameDestroy(TBsGnssLocationFrame *self);

/**
 * 数据接收
 * @param self: 对象指针
 * @param data: 数据内容
 * @param data_size: 数据大小
 * @return
 */
void TBsGnssLocationFrameOnRead(TBsGnssLocationFrame *self, const UInt8 *data, Int32 data_size);

/**
 * 执行函数
 * @param self: 对象指针
 * @return
 */
void TBsGnssLocationFrameRunOnce(TBsGnssLocationFrame *self);

/**
 * 获取Gnss的时间
 * @param self: 对象指针
 * @param time: 当返回值为True时，获取到的当前时间(0时区)
 * @return True: 获取成功; False: 获取失败
 * @note 当一次都没有定位成功，则会获取失败，当获取定位成功后，内部会记录收到的数据时间点和当前获取这个接口的时间间隔进行偏移得出当前真实的时间
 */
Bool TBsGnssLocationFrameGetTime(TBsGnssLocationFrame *self, UInt32 *time);

/**
 * 设置标记函数
 * @param self: 对象指针
 * @param nmea_token: 标记函数
 * @param user_param: nmea_token函数的第一个参数
 * @return 
 */
void TBsGnssLocationFrameSetNmeaToken(TBsGnssLocationFrame *self, TGnssLocationOnNmeaTokenEvent nmea_token, void *user_param);

/**
 * 获取解析时间
 * @param self: 对象指针
 * @return 时间
 */
UInt32 TBsGnssLocationFrameGetParseTime(TBsGnssLocationFrame *self);

/**
 * 获取最后一次定位的定位时间
 * @param self: 对象指针
 * @return 定位时间,单位:ms
 */
UInt32 TBsGnssLocationFrameGetGpsDevLastLocTick(TBsGnssLocationFrame *self);

/**
 * 设置最后一次定位的定位时间
 * @param self: 对象指针
 * @param tick: 设置的值
 * @return
 */
void TBsGnssLocationFrameSetGpsDevLastLocTick(TBsGnssLocationFrame *self, UInt32 tick);
#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */
 
 
 
 
 
 
 
 
 
 
